'use strict';

const Controller = require('egg').Controller;
const svgCaptcha = require('svg-captcha');

class CaptchaController extends Controller {
  /**
   * 生成验证码
   * GET /api/captcha
   * @returns {Object} - 返回 SVG 验证码图片
   */
  async generate() {
    const { ctx } = this;

    try {
      // 生成验证码
      const captcha = svgCaptcha.create({
        size: 4, // 验证码长度
        ignoreChars: '0oO1ilI', // 排除容易混淆的字符
        noise: 2, // 干扰线条数
        color: true, // 验证码字符是否有颜色
        background: '#f0f0f0', // 背景颜色
        width: 120,
        height: 40,
        fontSize: 50,
      });

      // 将验证码文本存储到 session 中（转为小写，方便验证时不区分大小写）
      ctx.session.captcha = captcha.text.toLowerCase();
      ctx.session.captchaExpire = Date.now() + 5 * 60 * 1000; // 5分钟过期

      ctx.logger.info('生成验证码:', {
        text: captcha.text,
        sessionId: ctx.session,
      });

      // 设置响应头
      ctx.type = 'image/svg+xml';
      ctx.body = captcha.data;
    } catch (error) {
      ctx.logger.error('生成验证码失败:', error);
      ctx.status = 500;
      ctx.body = {
        success: false,
        message: '生成验证码失败',
      };
    }
  }

  /**
   * 验证验证码
   * POST /api/captcha/verify
   * @body {string} captcha - 用户输入的验证码
   * @returns {Object} - 验证结果
   */
  async verify() {
    const { ctx } = this;
    const { captcha } = ctx.request.body;

    try {
      // 检查验证码是否存在
      if (!ctx.session.captcha) {
        ctx.body = {
          success: false,
          message: '验证码已过期，请重新获取',
        };
        return;
      }

      // 检查验证码是否过期
      if (Date.now() > ctx.session.captchaExpire) {
        // 清除过期的验证码
        ctx.session.captcha = null;
        ctx.session.captchaExpire = null;

        ctx.body = {
          success: false,
          message: '验证码已过期，请重新获取',
        };
        return;
      }

      // 验证验证码（不区分大小写）
      const isValid = captcha && captcha.toLowerCase() === ctx.session.captcha;

      if (isValid) {
        // 验证成功后立即清除验证码（防止重复使用）
        ctx.session.captcha = null;
        ctx.session.captchaExpire = null;

        ctx.body = {
          success: true,
          message: '验证码验证成功',
        };
      } else {
        ctx.body = {
          success: false,
          message: '验证码错误',
        };
      }
    } catch (error) {
      ctx.logger.error('验证验证码失败:', error);
      ctx.status = 500;
      ctx.body = {
        success: false,
        message: '验证验证码失败',
      };
    }
  }

  /**
   * 内部验证方法（供其他 controller 调用）
   * @param {string} inputCaptcha - 用户输入的验证码
   * @returns {boolean} - 验证结果
   */
  validateCaptcha(inputCaptcha) {
    const { ctx } = this;

    // 检查验证码是否存在
    if (!ctx.session.captcha) {
      return false;
    }

    // 检查验证码是否过期
    if (Date.now() > ctx.session.captchaExpire) {
      // 清除过期的验证码
      ctx.session.captcha = null;
      ctx.session.captchaExpire = null;
      return false;
    }

    // 验证验证码（不区分大小写）
    const isValid = inputCaptcha && inputCaptcha.toLowerCase() === ctx.session.captcha;

    if (isValid) {
      // 验证成功后立即清除验证码（防止重复使用）
      ctx.session.captcha = null;
      ctx.session.captchaExpire = null;
    }

    return isValid;
  }
}

module.exports = CaptchaController;

